/**
 * 
 */
package com.xpec.c4.game.system;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import redis.clients.jedis.Jedis;

import com.google.gson.Gson;
import com.ms.service.db.jedis.JedisManager;
import com.xpec.c4.game.time.TimeConstants;
import com.xpec.c4.game.utility.GUID;
import com.xpec.c4.game.utility.GUIDFactory;
import com.xpec.c4.game.utility.GUIDType;
import com.xpec.c4.game.utility.GameUtility;
import com.xpec.c4.service.module.ModuleName;

/**
 * GM tool API 跟多個 module 進行操作時記錄處理結果的 API
 * 
 * @author TW15010
 */
public class GMToolApiMultiModuleDAO {
	/**
	 * 取得 redis resource 的 key
	 */
	public static final String MODULE_NAME = ModuleName.GAMELOBBY;

	/**
	 * redis 資料 key 的前綴字串
	 */
	public static final String REDIS_KEY_PREFIX = "GMToolMultiModuleResult";

	/**
	 * 結果資料的保存過期時間
	 */
	public static final int RESULT_EXPIRE_TIME = (int) (10 * TimeConstants.SECOND_PRE_MINUTE);

	/**
	 * 取得這一次 request 的 result key, 要記下來, 後面取得結果時會用到
	 * 
	 * @param requestType
	 *            代表這一次 request 類型的字串
	 * @return
	 */
	public static String createResultKey(String requestType) {
		GUID resultId = GUIDFactory.createUUID(GUIDType.TYPE_GMAPI_MULTI_RESULT);

		if (!GameUtility.isHaveString(requestType)) {
			return resultId.toString();
		}

		return requestType + "_" + resultId.toString();
	}

	/**
	 * 將這一次 request 會用到的 module name 清單記下來
	 * 
	 * @param resultKey
	 * @param moduleNames
	 */
	public static void setRequestModuleList(String resultKey, ArrayList<String> moduleNames) {
		if (!GameUtility.isHaveString(resultKey)) {
			return;
		}

		if (GameUtility.getArrayListSize(moduleNames) <= 0) {
			return;
		}

		HashMap<String, String> nameMap = new HashMap<String, String>();
		for (String moduleName : moduleNames) {
			nameMap.put(moduleName, "");
		}

		String key = REDIS_KEY_PREFIX + ":" + resultKey;

		Jedis jedis = JedisManager.getResource(MODULE_NAME);

		jedis.hmset(key, nameMap);
		jedis.expire(key, RESULT_EXPIRE_TIME);

		JedisManager.returnResource(MODULE_NAME, jedis);
	}

	/**
	 * 各個 module 記錄自己的處理結果
	 * 
	 * @param moduleId
	 *            目前的 module id
	 * @param resultKey
	 * @param success
	 *            是否成功
	 * @param resultText
	 *            成功: 填 null, 失敗: 填失敗的原因字串.
	 */
	public static void setProcessResult(String moduleId, String resultKey, boolean success, String resultText) {
		if (!GameUtility.isHaveString(moduleId)) {
			return;
		}

		if (!GameUtility.isHaveString(resultKey)) {
			return;
		}

		String key = REDIS_KEY_PREFIX + ":" + resultKey;
		String fieldKey = moduleId;

		Jedis jedis = JedisManager.getResource(MODULE_NAME);

		if (success) {
			jedis.hdel(key, fieldKey);
		} else {
			jedis.hset(key, fieldKey, resultText);
		}

		JedisManager.returnResource(MODULE_NAME, jedis);
	}

	/**
	 * 取得執行結果
	 * 
	 * @param resultKey
	 * @return json string, key: module id, value: 失敗原因<br>
	 *         如果是空字串的表示全部都執行成功, 有 key 沒有 value 表示還沒寫入結果或是沒執行完.
	 */
	public static String getProcessResult(String resultKey) {
		if (!GameUtility.isHaveString(resultKey)) {
			return "";
		}

		String key = REDIS_KEY_PREFIX + ":" + resultKey;

		Jedis jedis = JedisManager.getResource(MODULE_NAME);

		Map<String, String> map = jedis.hgetAll(key);

		JedisManager.returnResource(MODULE_NAME, jedis);

		Gson gson = new Gson();
		String resultStr = gson.toJson(map);

		return resultStr;
	}
}
